//KMP算法的实现要先使用前缀表，然后可以实现O(m+n)的时间复杂度
#include <iostream>
#include <string>
using namespace std;
string str,pattern;
void getNext(int* next,const string& pat);
int SearchPatten(int *next,const string& s,const string& pat);
int main()
{
    cin>>str>>pattern;
    int len=pattern.size();
    int next[pattern.size()];
    getNext(next,pattern);
    int result=SearchPattern(next,str,pattern);
    cout<<result;
    return 0;
}

//构造前缀表,next数组记录的是最长相等前后缀的长度
/*使用i（1），j（0）指针,数组第一位为0
每次i与j字符比
如果i和j相同，i所在字符下的前缀值为j+1，i，j同时++。
i和j不同，j回到上一个字符的前缀值所指的字符，并继续与i比较，直到j回到0号，仍然不同则i所在字符前缀值为0*/
void getNext(int *next,const string& pat)
{
    int j=0;
    next[0]=0;
    for(int i=1;i<pat.size();i++)
    {
        while(j>0&&pat[i]!=pat[j])  //j保证大于0才能取下标j—1
        {
            j=next[j-1];
        }
        if(pat[i]==pat[j])
            j++;        //及实现了j进一位又实现了下一步
        next[i]=j;
    }
}

//匹配算法
/*
两个指针，一个指向字符串（pstr），一个指向模式字符串(ppat)
pstr不后退
当两指针指向的字符相同，ppat指向下一个继续比
不同时，ppat指向上一个字符的前缀值并回到该索引，直到回到0，仍然不同则pstr进一位
*/
int SearchPattern(int *next,const string& s,const string& pat)
{
    int ppat=0;
    for(int pstr=0;pstr<s.size();pstr++)
    {   
        //先进行不同的情况，进行不断回退
        while(s[pstr]!=pat[ppat]&&ppat>0)
            ppat=next[ppat-1];

        //相同的情况      
        if(s[pstr]==pat[ppat])
            ppat++;
        //当最后一个也相同，ppat超出索引范围，pstr指向模式字符串的最后一个
        if(ppat==pat.size())
            return (pstr-pat.size()+1);
    }
    return -1;
}

//判断字符串包含子字符串循环
//next数组记录的就是最长相等前后缀的长度，如果next[len-1]!=0,说明字符串有相等的前后缀
//len-next[len-1]相当于第一个重复子字符串长度，也就是一个重复周期，如果这个周期可以被len整除，则说明整个字符串就是这个周期的循环
bool repeatedSubStringPattern(const string& s)
{
    //获取next数组
    int next[s.size()];
    int j=0;
    for(int i=1;i<s.size();i++)
    {
        while(j>0&&s[i]!=s[j])
            j=next[j-1];
        if(s[i]==s[j])
            j++;
        next[i]=j;
    }
    //判断
    int len=s.size();
    if(next[len-1]!=0&&len%(len-next[len-1])==0)
        return true;
    return false;
}